import axios from 'axios'
import { getToken, setToken, removeToken, logout } from './auth'
import { userStorage } from './storage'
import { refreshToken } from '@/api/auth'
import router from '@/router'
import { ElMessage } from 'element-plus'

// const baseURL = 'http://localhost:5003/api'
const baseURL = 'http://api-rag.monkeymeerkat.cn/api'

// 创建axios实例
const api = axios.create({
  baseURL: baseURL,
  timeout: 10000
})

// 是否正在刷新token
let isRefreshing = false
// 存储等待刷新token的请求
let failedQueue = []
// 防止多次并发退出与重复提示
let isLoggingOut = false

// 处理等待队列中的请求
const processQueue = (error, token = null) => {
  failedQueue.forEach(prom => {
    if (error) {
      prom.reject(error)
    } else {
      prom.resolve(token)
    }
  })
  
  failedQueue = []
}

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 使用统一的token获取方法
    const token = getToken()
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    // 如果是文件下载请求，返回完整的response对象
    if (response.config.responseType === 'blob') {
      return response
    }
    return response.data
  },
  async (error) => {
    const originalRequest = error.config
    
    // 如果是401错误且不是刷新token的请求，尝试刷新token（在“记住我”为true时）
    if (error.response?.status === 401 && !originalRequest._retry && !originalRequest.url.includes('/auth/refresh-token')) {
      const rememberMe = userStorage.getRememberMe && userStorage.getRememberMe()
      // 没有选择记住我，直接退出到登录
      if (!rememberMe) {
        if (!isLoggingOut) {
          isLoggingOut = true
          // 关闭旧消息，避免堆叠
          ElMessage.closeAll()
          logout()
          // 登录页避免重复提示
          if (location.pathname !== '/login') {
            ElMessage.error('登录已过期，请重新登录')
          }
          router.push('/login')
          // 2秒后允许再次触发（进入登录页通常会更早重置）
          setTimeout(() => { isLoggingOut = false }, 2000)
        }
        return Promise.reject(error)
      }

      if (isRefreshing) {
        // 如果正在刷新，将请求加入队列
        return new Promise((resolve, reject) => {
          failedQueue.push({ resolve, reject })
        }).then(token => {
          originalRequest.headers.Authorization = `Bearer ${token}`
          return api(originalRequest)
        }).catch(err => {
          return Promise.reject(err)
        })
      }
      
      originalRequest._retry = true
      isRefreshing = true
      
      try {
        const refreshTokenValue = userStorage.getRefreshToken()
        if (!refreshTokenValue) {
          throw new Error('No refresh token available')
        }
        
        const response = await refreshToken({ refreshToken: refreshTokenValue })
        
        if (response && response.data && response.data.accessToken) {
          // 更新token
          setToken(response.data.accessToken)
          if (response.data.refreshToken) {
            userStorage.setRefreshToken(response.data.refreshToken)
          }
          
          // 处理等待队列
          processQueue(null, response.data.accessToken)
          
          // 重试原始请求
          originalRequest.headers.Authorization = `Bearer ${response.data.accessToken}`
          return api(originalRequest)
        } else {
          throw new Error('Invalid refresh token response')
        }
      } catch (refreshError) {
        console.error('Token refresh failed:', refreshError)
        
        // 处理等待队列
        processQueue(refreshError, null)
        
        // 清除所有认证信息
        if (!isLoggingOut) {
          isLoggingOut = true
          ElMessage.closeAll()
          logout()
          if (location.pathname !== '/login') {
            ElMessage.error('登录已过期，请重新登录')
          }
          router.push('/login')
          setTimeout(() => { isLoggingOut = false }, 2000)
        }
        
        return Promise.reject(refreshError)
      } finally {
        isRefreshing = false
      }
    }
    
    // 其他错误处理
    console.error('API Error:', error)
    
    // 如果是403错误，可能是权限不足
    if (error.response?.status === 403) {
      ElMessage.error('权限不足，无法访问该资源')
    }
    
    // 如果是500错误，服务器内部错误
    if (error.response?.status === 500) {
      ElMessage.error('服务器内部错误，请稍后重试')
    }
    
    // 如果是网络错误
    if (error.code === 'NETWORK_ERROR' || error.code === 'ECONNABORTED') {
      ElMessage.error('网络连接失败，请检查网络设置')
    }
    
    return Promise.reject(error)
  }
)

export default function request(config) {
  return api(config)
}